🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / network / src / commonMain / kotlin / org / meshtastic / core / network / radio / MockRadioTransport.kt
Displaying Raw • Download
core/network/src/commonMain/kotlin/org/meshtastic/core/network/radio/MockRadioTransport.kt b4bedd92fcc8d65daff79200d71f6ebc3d8f0cfa (b4bedd92) Text, 14.15 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.network.radio
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlinx.coroutines.CoroutineScope
Tff7b72import T7ee787kotlinx.coroutines.delay
Tff7b72import T7ee787okio.ByteString.Companion.encodeUtf8
Tff7b72import T7ee787okio.ByteString.Companion.toByteString
Tff7b72import T7ee787org.meshtastic.core.common.util.handledLaunch
Tff7b72import T7ee787org.meshtastic.core.common.util.nowSeconds
Tff7b72import T7ee787org.meshtastic.core.model.Channel
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.model.util.getInitials
Tff7b72import T7ee787org.meshtastic.core.repository.RadioTransport
Tff7b72import T7ee787org.meshtastic.core.repository.RadioTransportCallback
Tff7b72import T7ee787org.meshtastic.proto.AdminMessage
Tff7b72import T7ee787org.meshtastic.proto.Config
Tff7b72import T7ee787org.meshtastic.proto.Data
Tff7b72import T7ee787org.meshtastic.proto.DeviceMetadata
Tff7b72import T7ee787org.meshtastic.proto.DeviceMetrics
Tff7b72import T7ee787org.meshtastic.proto.FromRadio
Tff7b72import T7ee787org.meshtastic.proto.HardwareModel
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.ModuleConfig
Tff7b72import T7ee787org.meshtastic.proto.Neighbor
Tff7b72import T7ee787org.meshtastic.proto.NeighborInfo
Tff7b72import T7ee787org.meshtastic.proto.NodeInfo
Tff7b72import T7ee787org.meshtastic.proto.PortNum
Tff7b72import T7ee787org.meshtastic.proto.QueueStatus
Tff7b72import T7ee787org.meshtastic.proto.Routing
Tff7b72import T7ee787org.meshtastic.proto.StatusMessage
Tff7b72import T7ee787org.meshtastic.proto.Telemetry
Tff7b72import T7ee787org.meshtastic.proto.ToRadio
Tff7b72import T7ee787org.meshtastic.proto.User
Tff7b72import T7ee787kotlin.random.Random
Tff7b72import T7ee787org.meshtastic.proto.Channel Tff7b72as Te6edf3ProtoChannel
Tff7b72import T7ee787org.meshtastic.proto.MyNodeInfo Tff7b72as Te6edf3ProtoMyNodeInfo
Tff7b72import T7ee787org.meshtastic.proto.Position Tff7b72as Te6edf3ProtoPosition
Tff7b72private Tff7b72val Te6edf3defaultLoRaConfig Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4(Te6edf3use_preset Tff7b72= Tff7b72trueTb4b4b4, Te6edf3region Tff7b72= Te6edf3ConfigTb4b4b4.Te6edf3LoRaConfigTb4b4b4.Te6edf3RegionCodeTb4b4b4.Te6edf3TWTb4b4b4)
Tff7b72private Tff7b72val Te6edf3defaultChannel Tff7b72= Te6edf3ProtoChannelTb4b4b4(Te6edf3settings Tff7b72= Te6edf3ChannelTb4b4b4.Te6edf3defaultTb4b4b4.Te6edf3settingsTb4b4b4, Te6edf3role Tff7b72= Te6edf3ProtoChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARYTb4b4b4)
T8b949e/** A simulated transport that is used for testing in the simulator. */
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:TooManyFunctionsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4)
Tff7b72class T56d364MockRadioTransportTb4b4b4(
Tff7b72private Tff7b72val Te6edf3callbackTb4b4b4: Te6edf3RadioTransportCallbackTb4b4b4,
Tff7b72private Tff7b72val Te6edf3scopeTb4b4b4: Te6edf3CoroutineScopeTb4b4b4,
Tff7b72val Te6edf3addressTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3RadioTransport Tb4b4b4{
Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3MY_NODE Tff7b72= T79c0ff0Te6edf3x42424242
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3FAKE_SESSION_PASSKEYTb4b4b4: Te6edf3okioTb4b4b4.Te6edf3ByteString Tff7b72=
Te6edf3okioTb4b4b4.Te6edf3ByteStringTb4b4b4.Te6edf3ofTb4b4b4(T79c0ff0Te6edf3x00Tb4b4b4, T79c0ff0Te6edf3x11Tb4b4b4, T79c0ff0Te6edf3x22Tb4b4b4, T79c0ff0Te6edf3x33Tb4b4b4, T79c0ff0Te6edf3x44Tb4b4b4, T79c0ff0Te6edf3x55Tb4b4b4, T79c0ff0Te6edf3x66Tb4b4b4, T79c0ff0Te6edf3x77Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72var Te6edf3currentPacketId Tff7b72= T79c0ff5T79c0ff0
T8b949e// an infinite sequence of ints
Tff7b72private Tff7b72val Te6edf3packetIdSequence Tff7b72= Te6edf3generateSequence Tb4b4b4{ Te6edf3currentPacketIdTff7b72+Tff7b72+ Tb4b4b4}Tb4b4b4.Te6edf3iteratorTb4b4b4(Tb4b4b4)
Tff7b72override Tff7b72fun Td2a8ffstartTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffStarting the mock transportTa5d6ff" Tb4b4b4}
Te6edf3callbackTb4b4b4.Te6edf3onConnectTb4b4b4(Tb4b4b4) T8b949e// Tell clients they can use the API
Tb4b4b4}
Tff7b72override Tff7b72fun Td2a8ffhandleSendToRadioTb4b4b4(Te6edf3pTb4b4b4: Te6edf3ByteArrayTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3pr Tff7b72= Te6edf3ToRadioTb4b4b4.Te6edf3ADAPTERTb4b4b4.Te6edf3decodeTb4b4b4(Te6edf3pTb4b4b4)
T8b949e// Intercept want_config handshake — send config response only when requested,
T8b949e// mirroring the behaviour of real firmware which waits for want_config_id.
Tff7b72val Te6edf3wantConfigId Tff7b72= Te6edf3prTb4b4b4.Te6edf3want_config_id Tff7b72?: T79c0ff0
Tff7b72if Tb4b4b4(Te6edf3wantConfigId Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3sendConfigResponseTb4b4b4(Te6edf3wantConfigIdTb4b4b4)
Tff7b72return
Tb4b4b4}
Tff7b72val Te6edf3packet Tff7b72= Te6edf3prTb4b4b4.Te6edf3packet
Tff7b72if Tb4b4b4(Te6edf3packet Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3sendQueueStatusTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4)
Tb4b4b4}
Tff7b72val Te6edf3data Tff7b72= Te6edf3packetTff7b72?.Te6edf3decoded
Tff7b72when Tb4b4b4{
Te6edf3data Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3dataTb4b4b4.Te6edf3portnum Tff7b72=Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3ADMIN_APP Tff7b72-Tff7b72>
Te6edf3handleAdminPacketTb4b4b4(Te6edf3prTb4b4b4, Te6edf3AdminMessageTb4b4b4.Te6edf3ADAPTERTb4b4b4.Te6edf3decodeTb4b4b4(Te6edf3dataTb4b4b4.Te6edf3payloadTb4b4b4)Tb4b4b4)
Te6edf3packet Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3packetTb4b4b4.Te6edf3want_ack Tff7b72=Tff7b72= Tff7b72true Tff7b72-Tff7b72> Te6edf3sendFakeAckTb4b4b4(Te6edf3prTb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffIgnoring data sent to mock transport Tffd700$Te6edf3prTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffhandleAdminPacketTb4b4b4(Te6edf3prTb4b4b4: Te6edf3ToRadioTb4b4b4, Te6edf3dTb4b4b4: Te6edf3AdminMessageTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3prTb4b4b4.Te6edf3packet Tff7b72?: Tff7b72return
Tff7b72when Tb4b4b4{
Te6edf3dTb4b4b4.Te6edf3get_config_request Tff7b72=Tff7b72= Te6edf3AdminMessageTb4b4b4.Te6edf3ConfigTypeTb4b4b4.Te6edf3LORA_CONFIG Tff7b72-Tff7b72>
Te6edf3sendAdminTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3toTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3copyTb4b4b4(Te6edf3get_config_response Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3defaultLoRaConfigTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3get_channel_request Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0 Tff7b72-Tff7b72>
Te6edf3sendAdminTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3toTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3copyTb4b4b4(
Te6edf3get_channel_response Tff7b72=
Te6edf3ProtoChannelTb4b4b4(
Te6edf3index Tff7b72= Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3get_channel_request Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72- T79c0ff1Tb4b4b4, T8b949e// 0 based on the response
Te6edf3settings Tff7b72= Tff7b72if Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3get_channel_request Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Te6edf3ChannelTb4b4b4.Te6edf3defaultTb4b4b4.Te6edf3settings Tff7b72else Tff7b72nullTb4b4b4,
Te6edf3role Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3get_channel_request Tff7b72=Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3ProtoChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3PRIMARY
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3ProtoChannelTb4b4b4.Te6edf3RoleTb4b4b4.Te6edf3DISABLED
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Te6edf3dTb4b4b4.Te6edf3get_module_config_request Tff7b72=Tff7b72= Te6edf3AdminMessageTb4b4b4.Te6edf3ModuleConfigTypeTb4b4b4.Te6edf3STATUSMESSAGE_CONFIG Tff7b72-Tff7b72>
Te6edf3sendAdminTb4b4b4(Te6edf3packetTb4b4b4.Te6edf3toTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4) Tb4b4b4{
Te6edf3copyTb4b4b4(
Te6edf3get_module_config_response Tff7b72=
Te6edf3ModuleConfigTb4b4b4(
Te6edf3statusmessage Tff7b72=
Te6edf3ModuleConfigTb4b4b4.Te6edf3StatusMessageConfigTb4b4b4(Te6edf3node_status Tff7b72= Ta5d6ff"Ta5d6ffGoing to the farm.. to grow wheat.Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffIgnoring admin sent to mock transport Tffd700$Te6edf3dTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffcloseTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3i Tb4b4b4{ Ta5d6ff"Ta5d6ffClosing the mock transportTa5d6ff" Tb4b4b4}
Tb4b4b4}
T8b949e// / Generate a fake text message from a node
Tff7b72private Tff7b72fun Td2a8ffmakeTextMessageTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3from Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, T8b949e// broadcast
Te6edf3rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff1.5fTb4b4b4,
Te6edf3decoded Tff7b72=
Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TEXT_MESSAGE_APPTb4b4b4,
Te6edf3payload Tff7b72= Ta5d6ff"Ta5d6ffThis simulated node sends Hi!Ta5d6ff"Tb4b4b4.Te6edf3encodeUtf8Tb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffmakeNeighborInfoTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3from Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, T8b949e// broadcast
Te6edf3rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff1.5fTb4b4b4,
Te6edf3decoded Tff7b72=
Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3NEIGHBORINFO_APPTb4b4b4,
Te6edf3payload Tff7b72=
Te6edf3NeighborInfoTb4b4b4(
Te6edf3node_id Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3last_sent_by_id Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3node_broadcast_interval_secs Tff7b72= T79c0ff6T79c0ff0Tb4b4b4,
Te6edf3neighbors Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3NeighborTb4b4b4(
Te6edf3node_id Tff7b72= Te6edf3numIn Tff7b72+ T79c0ff1Tb4b4b4,
Te6edf3snr Tff7b72= T79c0ff1T79c0ff0.0fTb4b4b4,
Te6edf3last_rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3node_broadcast_interval_secs Tff7b72= T79c0ff6T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3NeighborTb4b4b4(
Te6edf3node_id Tff7b72= Te6edf3numIn Tff7b72+ T79c0ff2Tb4b4b4,
Te6edf3snr Tff7b72= T79c0ff1T79c0ff2.0fTb4b4b4,
Te6edf3last_rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3node_broadcast_interval_secs Tff7b72= T79c0ff6T79c0ff0Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffmakePositionTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3from Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, T8b949e// broadcast
Te6edf3rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff1.5fTb4b4b4,
Te6edf3decoded Tff7b72=
Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3POSITION_APPTb4b4b4,
Te6edf3payload Tff7b72=
Te6edf3ProtoPositionTb4b4b4(
Te6edf3latitude_i Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(T79c0ff3T79c0ff2.776665Tb4b4b4)Tb4b4b4,
Te6edf3longitude_i Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(Tff7b72-T79c0ff9T79c0ff6.796989Tb4b4b4)Tb4b4b4,
Te6edf3altitude Tff7b72= T79c0ff1T79c0ff5T79c0ff0Tb4b4b4,
Te6edf3time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3precision_bits Tff7b72= T79c0ff1T79c0ff5Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffmakeTelemetryTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3from Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, T8b949e// broadcast
Te6edf3rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff1.5fTb4b4b4,
Te6edf3decoded Tff7b72=
Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TELEMETRY_APPTb4b4b4,
Te6edf3payload Tff7b72=
Te6edf3TelemetryTb4b4b4(
Te6edf3time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3device_metrics Tff7b72=
Te6edf3DeviceMetricsTb4b4b4(
Te6edf3battery_level Tff7b72= T79c0ff8T79c0ff5Tb4b4b4,
Te6edf3voltage Tff7b72= T79c0ff4.1fTb4b4b4,
Te6edf3channel_utilization Tff7b72= T79c0ff0.12fTb4b4b4,
Te6edf3air_util_tx Tff7b72= T79c0ff0.05fTb4b4b4,
Te6edf3uptime_seconds Tff7b72= T79c0ff1T79c0ff2T79c0ff3T79c0ff4T79c0ff5T79c0ff6Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffmakeNodeStatusTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3from Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3to Tff7b72= T79c0ff0Te6edf3xffffffffTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4, T8b949e// broadcast
Te6edf3rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff1.5fTb4b4b4,
Te6edf3decoded Tff7b72=
Te6edf3DataTb4b4b4(
Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3NODE_STATUS_APPTb4b4b4,
Te6edf3payload Tff7b72=
Te6edf3StatusMessageTb4b4b4(Te6edf3status Tff7b72= Ta5d6ff"Ta5d6ffGoing to the farm.. to grow wheat.Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffmakeDataPacketTb4b4b4(Te6edf3fromInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3toInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3dataTb4b4b4: Te6edf3DataTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3packet Tff7b72=
Te6edf3MeshPacketTb4b4b4(
Te6edf3id Tff7b72= Te6edf3packetIdSequenceTb4b4b4.Te6edf3nextTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3from Tff7b72= Te6edf3fromInTb4b4b4,
Te6edf3to Tff7b72= Te6edf3toInTb4b4b4,
Te6edf3rx_time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3rx_snr Tff7b72= T79c0ff1.5fTb4b4b4,
Te6edf3decoded Tff7b72= Te6edf3dataTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffmakeAckTb4b4b4(Te6edf3fromInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3toInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3msgIdTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3makeDataPacketTb4b4b4(
Te6edf3fromInTb4b4b4,
Te6edf3toInTb4b4b4,
Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3ROUTING_APPTb4b4b4, Te6edf3payload Tff7b72= Te6edf3RoutingTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3request_id Tff7b72= Te6edf3msgIdTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffsendQueueStatusTb4b4b4(Te6edf3msgIdTb4b4b4: Tffa657IntTb4b4b4) Tff7b72= Te6edf3callbackTb4b4b4.Te6edf3handleFromRadioTb4b4b4(
Te6edf3FromRadioTb4b4b4(Te6edf3queueStatus Tff7b72= Te6edf3QueueStatusTb4b4b4(Te6edf3res Tff7b72= T79c0ff0Tb4b4b4, Te6edf3free Tff7b72= T79c0ff1T79c0ff6Tb4b4b4, Te6edf3mesh_packet_id Tff7b72= Te6edf3msgIdTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffsendAdminTb4b4b4(Te6edf3fromInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3toInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3reqIdTb4b4b4: Tffa657IntTb4b4b4, Te6edf3initFnTb4b4b4: Te6edf3AdminMessageTb4b4b4.Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Te6edf3AdminMessageTb4b4b4) Tb4b4b4{
T8b949e// Embed a deterministic 8-byte fake passkey so SessionManager can record a session refresh — mirrors what real
T8b949e// firmware always attaches to admin responses (see firmware/src/modules/AdminModule.cpp:1460-1481).
Tff7b72val Te6edf3adminMsg Tff7b72= Te6edf3AdminMessageTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3initFnTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3copyTb4b4b4(Te6edf3session_passkey Tff7b72= Te6edf3FAKE_SESSION_PASSKEYTb4b4b4)
Tff7b72val Te6edf3p Tff7b72=
Te6edf3makeDataPacketTb4b4b4(
Te6edf3fromInTb4b4b4,
Te6edf3toInTb4b4b4,
Te6edf3DataTb4b4b4(Te6edf3portnum Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3ADMIN_APPTb4b4b4, Te6edf3payload Tff7b72= Te6edf3adminMsgTb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3toByteStringTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3request_id Tff7b72= Te6edf3reqIdTb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3callbackTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3pTb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
T8b949e// / Send a fake ack packet back if the sender asked for want_ack
Tff7b72private Tff7b72fun Td2a8ffsendFakeAckTb4b4b4(Te6edf3prTb4b4b4: Te6edf3ToRadioTb4b4b4) Tff7b72= Te6edf3scopeTb4b4b4.Te6edf3handledLaunch Tb4b4b4{
Tff7b72val Te6edf3packet Tff7b72= Te6edf3prTb4b4b4.Te6edf3packet Tff7b72?: Tff7b72returnTf0883e@handledLaunch
Te6edf3delayTb4b4b4(T79c0ff2T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)
Te6edf3callbackTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3makeAckTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3packetTb4b4b4.Te6edf3fromTb4b4b4, Te6edf3packetTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffsendConfigResponseTb4b4b4(Te6edf3configIdTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3d Tb4b4b4{ Ta5d6ff"Ta5d6ffSending mock config responseTa5d6ff" Tb4b4b4}
T8b949e// / Generate a fake node info entry
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72fun Td2a8ffmakeNodeInfoTb4b4b4(Te6edf3numInTb4b4b4: Tffa657IntTb4b4b4, Te6edf3latTb4b4b4: Tffa657DoubleTb4b4b4, Te6edf3lonTb4b4b4: Tffa657DoubleTb4b4b4) Tff7b72= Te6edf3FromRadioTb4b4b4(
Te6edf3node_info Tff7b72=
Te6edf3NodeInfoTb4b4b4(
Te6edf3num Tff7b72= Te6edf3numInTb4b4b4,
Te6edf3user Tff7b72=
Te6edf3UserTb4b4b4(
Te6edf3id Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3numToDefaultIdTb4b4b4(Te6edf3numInTb4b4b4)Tb4b4b4,
Te6edf3long_name Tff7b72= Ta5d6ff"Ta5d6ffSim Tffd700${Te6edf3numInTb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff1T79c0ff6Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4,
Te6edf3short_name Tff7b72= Te6edf3getInitialsTb4b4b4(Ta5d6ff"Ta5d6ffSim Tffd700${Te6edf3numInTb4b4b4.Te6edf3toStringTb4b4b4(T79c0ff1T79c0ff6Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3hw_model Tff7b72= Te6edf3HardwareModelTb4b4b4.Te6edf3ANDROID_SIMTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3position Tff7b72=
Te6edf3ProtoPositionTb4b4b4(
Te6edf3latitude_i Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(Te6edf3latTb4b4b4)Tb4b4b4,
Te6edf3longitude_i Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3coreTb4b4b4.Te6edf3modelTb4b4b4.Te6edf3PositionTb4b4b4.Te6edf3degITb4b4b4(Te6edf3lonTb4b4b4)Tb4b4b4,
Te6edf3altitude Tff7b72= T79c0ff3T79c0ff5Tb4b4b4,
Te6edf3time Tff7b72= Te6edf3nowSecondsTb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3precision_bits Tff7b72= Te6edf3RandomTb4b4b4.Te6edf3nextIntTb4b4b4(T79c0ff1T79c0ff0Tb4b4b4, T79c0ff1T79c0ff9Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e// Simulated network data to feed to our app
Tff7b72val Te6edf3packets Tff7b72=
Te6edf3arrayOfTb4b4b4(
T8b949e// MyNodeInfo
Te6edf3FromRadioTb4b4b4(Te6edf3my_info Tff7b72= Te6edf3ProtoMyNodeInfoTb4b4b4(Te6edf3my_node_num Tff7b72= Te6edf3MY_NODETb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3FromRadioTb4b4b4(
Te6edf3metadata Tff7b72= Te6edf3DeviceMetadataTb4b4b4(Te6edf3firmware_version Tff7b72= Ta5d6ff"Ta5d6ff9.9.9.abcdefgTa5d6ff"Tb4b4b4, Te6edf3hw_model Tff7b72= Te6edf3HardwareModelTb4b4b4.Te6edf3ANDROID_SIMTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
T8b949e// Fake NodeDB
Te6edf3makeNodeInfoTb4b4b4(Te6edf3MY_NODETb4b4b4, T79c0ff3T79c0ff2.776665Tb4b4b4, Tff7b72-T79c0ff9T79c0ff6.796989Tb4b4b4)Tb4b4b4, T8b949e// dallas
Te6edf3makeNodeInfoTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4, T79c0ff3T79c0ff2.960758Tb4b4b4, Tff7b72-T79c0ff9T79c0ff6.733521Tb4b4b4)Tb4b4b4, T8b949e// richardson
Te6edf3FromRadioTb4b4b4(Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3defaultLoRaConfigTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3FromRadioTb4b4b4(Te6edf3config Tff7b72= Te6edf3ConfigTb4b4b4(Te6edf3lora Tff7b72= Te6edf3defaultLoRaConfigTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3FromRadioTb4b4b4(Te6edf3channel Tff7b72= Te6edf3defaultChannelTb4b4b4)Tb4b4b4,
Te6edf3FromRadioTb4b4b4(Te6edf3config_complete_id Tff7b72= Te6edf3configIdTb4b4b4)Tb4b4b4,
T8b949e// Done with config response, now pretend to receive some text messages
Te6edf3makeTextMessageTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makeNeighborInfoTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makePositionTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makeTelemetryTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Te6edf3makeNodeStatusTb4b4b4(Te6edf3MY_NODE Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3packetsTb4b4b4.Te6edf3forEach Tb4b4b4{ Te6edf3p Tff7b72-Tff7b72> Te6edf3callbackTb4b4b4.Te6edf3handleFromRadioTb4b4b4(Te6edf3pTb4b4b4.Te6edf3encodeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.1s